// https://www.nowcoder.com/practice/99eb8040d116414ea3296467ce81cbbc?tpId=230&tqId=2023819&ru=/exam/oj&qru=/ta/dynamic-programming/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196

// 题干：给你一个 n 行 m 列的矩阵 A ，下标从1开始。
//       接下来有 q 次查询，每次查询输入 4 个参数 x1 , y1 , x2 , y2
//       请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和

// 示例：输入：
//      3 4 3
//      1 2 3 4
//      3 2 1 0
//      1 5 7 8
//      1 1 2 2
//      1 1 3 3
//      1 2 3 4
//       输出：
//      8
//      25
//      32

// 碎语：二维dp的模板题，搞不清楚的话画张图即可，理清它们的关系，我们仍然空出来下标为0的位置
//       这种方法可以完美地避免边界处理的情况

#include <iostream>
using namespace std;

const int N = 1010;
int arr[N][N];
long long dp[N][N];

int main()
{
    int n, m, q;
    cin >> n >> m >> q;

    for (int i = 1 ; i < n + 1 ; i++){
        for (int j = 1 ; j < m + 1 ; j++){
            cin >> arr[i][j];
        }
    }

    for (int i = 1 ; i < n + 1 ; i++){
        for (int j = 1 ; j < m + 1 ; j++){
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1];
        }
    }

    int x1, y1, x2, y2;
    while (q--){
        cin >> x1 >> y1 >> x2 >> y2;
        cout << dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1] << endl;
    }

    return 0;
}
